package com.adee.java.classloader;

import java.sql.*;
import java.util.Iterator;
import java.util.ServiceLoader;

public class ThreadContextClassLoaderTest {
    public static void main(String[] args) throws Exception {
        test2();
    }

    public static void test1() {
        /**
         * ServiceLoader.load(Driver.class) 方法是SPI机制的实现，
         * 会扫描classpath下全部jar，如果jar中META-INF/services目录下有名为java.sql.Driver的文件，则
         * 文件中的每行内容就是java.sql.Driver接口的实现类，将所有实现类使用线程上下文类加载器加载，得到的class
         * 对象反射调用无参构造方法创建出来一个对象，放入集合中。然后loader就可以遍历该集合取出对象。
         * 线程上下文类加载器是在jvm启动时，在BootstrapClassLoader代码中设置的，默认为AppClassLoader。
         *
         */
        // Driver.class接口是由BootstrapClassLoader加载的
        ServiceLoader<Driver> loader = ServiceLoader.load(Driver.class);
        Iterator<Driver> iterator = loader.iterator();
        // class com.mysql.cj.jdbc.Driver, 类加载器：jdk.internal.loader.ClassLoaders$AppClassLoader@3fee733d
        while (iterator.hasNext()){
            Driver dirver = iterator.next();
            // 每个Driver的实现类都是有AppClassLoader加载的
            System.out.println(dirver.getClass()+", 类加载器："+dirver.getClass().getClassLoader());
        }
        // jdk.internal.loader.ClassLoaders$AppClassLoader@3fee733d
        System.out.println("当前线程上线文类加载器："+Thread.currentThread().getContextClassLoader());
        // ServiceLoader类加载器：null
        System.out.println("ServiceLoader类加载器："+loader.getClass().getClassLoader());
    }

    public static void test2() throws Exception {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection("jdbc:mysql://8.142.104.99:3306/db1",
                "root", "5UNRltoxlye6Zpjd");
        Statement statement = conn.createStatement();
        ResultSet resultSet = statement.executeQuery("select * from admin");
        while (resultSet.next()) {
            System.out.printf("id=%d,username=%s,password=%s\n",
                    resultSet.getInt(1),
                    resultSet.getString(2),
                    resultSet.getString(3));
        }
        resultSet.close();
        statement.close();
        conn.close();
    }
}
